[Xcode 5] Test Navigator と XCTestを使ってみる
はじめに
Xcode 5 で XCTest という新しいテストフレームワークが投入されました。OCUnitを使ったプロジェクトからのコンバートもできるので、それを置き換えるものと考えて良さそうです。また Test Navigator という新しいナビゲータが導入され、テストターゲットとの親和性が高くなっているようです。さらにコマンドラインからのテスト実行もサポートされました。
導入
何も考えなくてもプロジェクトを作成すると勝手にTestターゲットが作成されます。素敵です。
メニューからProduct -> Test 又は Command + U でテストが実行されます。Testクラス新規作成時はXCFailが1つ設定されているので必ずテストが失敗します。この辺はOCUnitと変わりません。
Test Navigator で動作させる
ナビゲータから↓のアイコンを選択します。
最後に実行したテストのメソッドやクラス単位での 成功/失敗 が 緑/赤 のアイコンで表示されます。そのアイコン上にカーソルを置くとテスト実行アイコンに変わります。例えば失敗したテストのみを選択して実行できるので、全てのテストを実行しなくてもよくなり、実行時間を短縮できます。
また、テストターゲットの追加やテストクラスの追加が左下のメニューから簡単にできます。
Assistant editorで表示する
Assistant editorで左ペインに実装ファイル(.m)を選択すると右ペインにテストクラスを自動的に横に並べて表示できます。これがこの記事で一番便利になった機能だと思ってます。
XCUnit の Assert 一覧
Assert | 説明 |
---|---|
XCTFail(format...) | 必ず失敗します |
XCTAssertNil(a1, format...) | a1がnilであることを期待します |
XCTAssertNotNil(a1, format...) | a1がnilでないことを期待します |
XCTAssert(expression, format...) | expressionがYESであることを期待します |
XCTAssertTrue(expression, format...) | expressionがYESであることを期待します |
XCTAssertFalse(expression, format...) | expressionがNOであることを期待します |
XCTAssertEqualObjects(a1, a2, format...) | a1とa2のオブジェクトの内容を比較し、同じであることを期待します< !{ [a1 isEqual:a2] } > |
XCTAssertNotEqualObjects(a1, a2, format...) | a1とa2のオブジェクトの内容を比較し、違いがあることを期待します< { [a1 isEqual:a2] } > |
XCTAssertEqual(a1, a2, format...) | a1とa2を比較し、同じであることを期待します。int等のスカラー型、構造体、共用体に使用します |
XCTAssertNotEqual(a1, a2, format...) | a1とa2を比較し、違いがあることを期待します。int等のスカラー型、構造体、共用体に使用します |
XCTAssertEqualWithAccuracy(a1, a2, accuracy, format...) | a1とa2を比較し、accuracy 以内の差に収まっていることを期待します |
XCTAssertNotEqualWithAccuracy(a1, a2, accuracy, format...) | a1とa2を比較し、accuracy より差が大きいことを期待します |
XCTAssertThrows(expression, format...) | expression で 例外が発生することを期待します |
XCTAssertThrowsSpecific(expression, specificException, format...) | expression で特定のクラス(specificException)の例外が発生することを期待します |
XCTAssertThrowsSpecificNamed(expression, specificException, exception_name, format...) | expression で特定のクラス(specificException)の例外が特定の名前(exception_name)で発生することを期待します。例えばNSExceptionでNSInvalidArgumentExceptionなど |
XCTAssertNoThrow | expression で 例外が発生しないことを期待します |
XCTAssertNoThrowSpecific | expression で特定のクラス(specificException)の例外が発生しないことを期待します |
XCTAssertNoThrowSpecificNamed | expression で特定のクラス(specificException)の例外が特定の名前(exception_name)で発生しないことを期待します。例えばNSExceptionでNSInvalidArgumentExceptionなど |
これもOCUnitと同じようです。
OCUnitからのコンバート
そんなわけで、OCUnitからのコンバートも可能になっています。
#import や アサーションを書き換えてくれます。
コマンドラインからのテストの実行
xcodebuild でテスト実行できます。Jenkins 等使っている場合にこれで実行できそうです。
xcodebuild test -scheme {テスト対象のスキーム} -destination 'name={Xcodeに表示されているシミュレータも含むデバイスの名前},OS={テスト対象OSバージョン}'
例えば↓のような感じです。
xcodebuild test -scheme CIApp2 -destination 'name=iPhone Retina (3.5-inch),OS=7.0'
まとめ
大きな変更は無いようですが、Test Navigator や Assistant editor 、xcodebuild からのテストなどで地味に着実に使いやすくなっているようでした。